<!-- 文档分类: OPS-MAN-034 | 阶段: 运维 | 原路径: docs/维护者/TODO.md -->
当前协作待办#
更新时间: 2026-06-01
范围约束:
- 当前只聚焦
backend/src/cli/*、backend/src/services/*、backend/tests/* - 暂不触碰
khy_os-0.1.78/的批量删除项 - 在工作树大面积脏变更未澄清前,优先做小范围、可验证修复
当前已确认状态:
npm run check:version-sync通过,版本同步为0.1.80- v0.1.80 新增: TUI 工作叙事协议 + 交互选择覆盖层 + 表格渲染修复 + 默认 admin05 登录
node scripts/check-agent-rules.js --changed当前通过,无规则告警;claudeAdapter.js的 3 个固定超时告警已改为 activity-based kill escalationnpm --prefix backend test -- --runInBand backend/tests/initDoctor.codingAgentSmoke.test.js backend/tests/services/traceAuditService.requestId.test.js通过khy doctor当前结果为20 通过 · 5 警告 · 0 失败Codex运行时诊断已持久化到~/.khy/gateway/codex_runtime_diagnostics.json- 持久化结构现为双槽位:
latest+lastFirstResponseTimeout - 目的:避免后续
provider_fallback_recovered/ healed 记录覆盖最近一次首响 stall 证据 khy doctor新起进程后也能跨进程读取,并在Codex 自愈状态中追加最近首响阻塞
- 持久化结构现为双槽位:
- 已新增通用
runtimeDiagnosticsStore- 新文件:
backend/src/services/gateway/runtimeDiagnosticsStore.js - 统一持久化结构:
latest+latestByTrigger+latestByCategory - 当前已接入
codex与claude doctor现已按活跃 adapter 通用消费;非codex通道会显示${adapterName} 运行时诊断
- 新文件:
首段语言一致性已从误报失败修正为信息态最近交付链路已从误报告警修正为“仅记录最终交付事件”的信息态KHY_GATEWAY_DEBUG_PROMPT=1证据已采集:/tmp/khy_gateway_prompt_debug.log明确显示codex/cursor/claude请求前均已注入KHY Protocol Priority与KHY PRIORITY DIRECTIVE- 已采到
Codex CLI启动噪声的原始证据:codex exec --json在真实模型正文前就会输出thread.started/turn.started/error: Reconnecting...- 同时
stderr还会输出WARNING: proceeding, even though we could not update PATH...、Reading prompt from stdin...、failed to record rollout items: channel closed - 结论: 先前
firstResponseTimer被“任意子进程字节”过早清掉,导致请求虽然没有真实模型进展,却不会按首响超时收口
- 已新增可重复采样入口:
khy gateway sample codex --attempts 4 --timeout-ms 12000 --json- 该命令会串行运行 strict Codex 样本,并聚合
promptInjected / firstChunk / timeout / requestId - 已用真实命令验证:
requestId=7824e04010a6cafcbc79682c6b91b080,输出目录/tmp/khy-gateway-sample-codex-1780207669060
- 本地审计历史已证实
Codex CLI (mindflow)存在真实且间歇性的中文偏航,不再只是理论风险 - 已定位
summary_only的主要成因:toolUseLoop -> chat/aiGateway曾漏传sessionId/requestId/_diagTraceId,导致agent.delivery.final与llm.request/response分落不同 trace - 已补齐
ai.chat -> aiGateway.generate的最后一跳 trace 透传;当前~/.khy/auditrecentsummary_only仍主要是修复前历史样本与本地测试伪请求 - 已完成真实 home-audit live run 验证:
- one-shot
startRepl({ oneShot: true })只走ai.chat,可验证llm.request/response,但不会产出agent.delivery.final - 交互 REPL +
toolUseLoop的真实请求requestId=d8af0a2c6e0d8b8430668dc9b2845e82已在同一 requestId 上落下llm.request、llm.response、agent.tool.call/result、agent.delivery.final node backend/bin/khy.js gateway status --json已同步反映最新受约束闭环请求requestId=8eb49ea7c0c2f6d98ff5e4bdabfdafbf:latestDeliveryRequest.status=completed,latestLanguageConsistency.requestId也已对齐- 新的真实约束闭环请求
requestId=8eb49ea7c0c2f6d98ff5e4bdabfdafbf已证明“不要调用任何工具 / 不要搜索 / 不要读取文件”会被前置约束和执行层拦截共同尊重,最终agent.delivery.final.totalToolCalls=0 - 上述请求同一
requestId仍保留了llm.request、agent.language.first_chunk、llm.response、agent.delivery.final,说明当前结论已从“协议优先级风险猜测”推进到“约束守卫生效且可审计”的结论 - 本地本次执行
node backend/bin/khy.js gateway status --json在当前环境约11s返回,消费端可用但仍偏慢
- one-shot
- 已量化
summary_only残留现状:- 扫描最近
1000个 session,共发现96个带agent.delivery.final的 request,其中summary_only=15(15.63%) - 但最近
50个 request 里summary_only=2(4%);最近20个 session 中已降到0 - 最新
summary_only样本为requestId=94e0350b2aae0904ab1289b8fe0dfc57,时间2026-05-31T03:32:54.754Z;之后已出现requestId=d8af0a2c6e0d8b8430668dc9b2845e82与8eb49ea7c0c2f6d98ff5e4bdabfdafbf的真实闭环请求 - 当前
summary_only样本都表现为单条agent.delivery.final、source=tool-loop、eventCount=1、totalToolCalls=0、hasConclusion=false
- 扫描最近
- 新发现: 修复后仍存在多条
eventCount=1但status=completed的 request(如requestId=7d03583eb9b8eaf5cbd0922d6c1214c1,时间2026-05-31T04:19:04.703Z),说明“只落最终交付事件”的问题并未完全消失,只是部分样本因hasConclusion=true不再落入summary_only - 已完成旁路补审计:
backend/src/cli/ai.js里的khy-fastpath与_directGenerate -> multiFreeService.generateResponse已补llm.request/response- 真实 home-audit live run
requestId=11111111111111111111111111111111已证明toolUseLoop + khy-fastpath现在会同时落下agent.loop.start、llm.request、llm.response、agent.delivery.final,不再是单条 final 事件
- 已定位近期
eventCount=1且status=completed的主要来源:traceAudit.logEvent()在缺少sessionId时会自动生成sess_*toolUseLoop即使没有显式 session,也会落agent.delivery.final- Jest 默认此前会把这类测试事件写进
~/.khy/audit,从而制造大量finalReplyLength=5、hasConclusion=true、source=tool-loop的单事件 session - 典型噪音已与测试对上:
sess-trace-pass来自backend/tests/toolUseLoop.structuredContext.test.js,其Done.恰好对应finalReplyLength=5
- 已修复测试污染 home-audit 的根因:
backend/src/services/traceAuditService.js现在在NODE_ENV=test或存在JEST_WORKER_ID且未显式设置KHY_TRACE_AUDIT_DIR时,默认落到/tmp/khy-audit-jest/worker-*- 这会阻止后续 Jest 继续把单事件 session 写进
~/.khy/audit
- 当前工作树共有
1510条变更,其中1480条是khy_os-0.1.78/整包删除 - 已完成
khy_os-0.1.78/删除归因:git log --diff-filter=AD --all -- '*khy_os-*'仅显示df9589f新增khy_os-0.1.74/与2e3a0d6新增khy_os-0.1.78/,不存在既定的历史清理链路- 顶层当前仍保留
khy_os-0.1.74/(约158M,1472个 tracked files),而khy_os-0.1.78/处于不对称整包删除态(1480个删除) - 根目录
setup.py仅打包当前源码树生成的khy_os/bundled/**/*;CI/release 也只消费根目录pyproject.toml、setup.py、scripts/* - 结论:
khy_os-0.1.78/不是运行时/构建时硬依赖,但当前删除形态更像误删或半途清理,不应混入本轮协议/审计修复提交 - 处理建议: 本轮继续不触碰该目录内容;若要治理版本快照,单独发起对称清理或迁移,并补仓库层策略说明
- 已把
Codex CLI (mindflow)的语言约束前置到请求入口:backend/src/services/gateway/aiGateway.js现在会在中文请求命中codex时,显式注入# Language中文约束块- 该约束会稳定进入
codexAdapter.buildCliPrompt()的 flatten prompt,而不再只依赖通用优先级提示和事后纠偏 - 聚焦回归已通过:
backend/tests/aiGateway.languageConsistency.test.js、backend/tests/gatewayAdapters.stability.test.js
- 已补 live audit 证据,但暂未拿到可用首段正文样本:
- 真实 REPL 请求
requestId=2eee500e765b48120e7c3d9b2d4ee429已证明Codex CLI (mindflow)实际请求中确实包含前置# Language中文约束 - 对应
/tmp/khy-live-audit-codex-20260531/prompt.log明确记录:system_preview=# Language KHY expected output: Simplified Chinese... - 该请求随后被上游传输异常拖入长时间
Reconnecting...,最终人工中断;因此只拿到了final_response=请求已取消,没有可用于判断英文首段是否下降的正文首块 - 更轻量的 print-mode 请求
requestId=d07601333b3d92857c87fbc4a20ea838也已发出并记录同样的前置# Language注入,但截至检查时仅落下llm.request/diag.model_request,仍无llm.response - 新 one-shot 请求
requestId=80aceeb617b47ee17a9d88eacb96bf14(审计目录/tmp/khy-live-audit-codex-20260531c)再次落盘同样证据:prompt.log记录system_preview=# Language KHY expected output: Simplified Chinese...prompt_preview记录[KHY PRIORITY DIRECTIVE] ... Default to Chinese ...
- 该请求在早期观测窗口内一度只落下
llm.request/diag.model_request,表现得像“响应前卡死” - 但后续继续复盘同一
requestId可见它最终演化为:typeCounts = { llm.request, diag.model_request, agent.language.final_response, llm.response }- 当前
latestDeliveryRequest.status=response_only latestDeliveryRequest.brokenStage=nulllatestLanguageConsistency.status=alignedlatestLanguageConsistency.adapter=API 中转latestLanguageConsistency.source=final_response
- 结论: 这条真实样本不是“永久卡在响应前”,而是更接近“Codex 超时后回退到 API 中转,并生成了中文最终答复”;由于该请求属于 one-shot
ai.chat,当前已把它从delivery_event_missing误报修正为response_only,不再误判成 tool-loop 断链;它仍然证明 KHY 前置中文协议已经真实进了请求,但暂时仍不能用于衡量英文首段下降幅度 - 新增一条“尽量只走 Codex”的 strict 样本
requestId=5c2edb3db439327f7c900e6adac1a467(审计目录/tmp/khy-live-audit-codex-strict-20260531):- 环境约束:
GATEWAY_PREFERRED_STRICT=trueGATEWAY_STRICT_AUTO_RELAX_ON_PROCESS=falseGATEWAY_ADAPTER_MAX_ATTEMPTS=1KHY_GATEWAY_THROW_FALLBACK=false
prompt.log再次确认真实请求中存在前置# Language中文约束与[KHY PRIORITY DIRECTIVE]- 截至本轮采样窗口结束,
trace-events.jsonl仍只有llm.request与diag.model_request - 同目录
gateway status --json已显示:latestDeliveryRequest.status=incompletelatestDeliveryRequest.brokenStage=before_tool_calllatestLanguageConsistency.reason=awaiting_model_output_for_requestlatestLanguageConsistency.blockedBy=pre_response_stall
- 环境约束:
- 新 strict 样本
requestId=b4f5bfcc0e08e2802267cbfb670e4c83(审计目录/tmp/khy-live-audit-codex-firstresp-20260531c)已验证修复后的收口行为:- 环境约束:
GATEWAY_PREFERRED_ADAPTER=codexGATEWAY_PREFERRED_STRICT=trueGATEWAY_STRICT_AUTO_RELAX_ON_PROCESS=falseGATEWAY_ADAPTER_MAX_ATTEMPTS=1GATEWAY_CODEX_OPENAI_FALLBACK_ENABLED=falseGATEWAY_CODEX_FIRST_RESPONSE_TIMEOUT_MS=8000KHY_GATEWAY_THROW_FALLBACK=false
prompt.log再次确认真实请求中存在前置# Language中文约束与[KHY PRIORITY DIRECTIVE]- 同一请求在约
8s后明确结束为:Codex [timeout]: codex first response timeout after 8000ms without meaningful model progresslatestDeliveryRequest.status=response_onlylatestLanguageConsistency.status=aligned
- 结论: 真实链路已不再因启动噪声长期挂成
incomplete;当前可把pre_response_stall的主要成因收敛为“Codex 在首个有意义模型进展前只输出启动/传输噪声”
- 环境约束:
- 新批量 strict 采样
/tmp/khy-codex-batch-20260531a(4 次串行 one-shot,GATEWAY_CODEX_FIRST_RESPONSE_TIMEOUT_MS=12000)结果:run-1requestId=64b3602bc3c16dd2735b3fb433e70b7drun-2requestId=9d73bc065d1a1ec07a7125904555303arun-3requestId=305a652cf0a0246397b4c7059539bd55run-4requestId=48f410236e59deb219fb71252dd2f33e- 4/4 均确认
promptInjected=true - 4/4 均未落下
agent.language.first_chunk - 4/4 最终都以
llm.response.success=false、errorType=timeout收口 - 4/4 的最终语言审计都只来自中文失败文案
agent.language.final_response,不是 Codex 正文首块 - 结论: 在当前上游窗口里,前置
# Language注入已稳定,但“英文首段是否下降”仍无法直接量化,因为可用样本池暂时是0条成功首块、4条响应前超时
- 新批量 strict 采样
/tmp/khy-codex-batch-20260531b(4 次串行 one-shot,新增“确定性降偏航第二阶段”后复测,HOME=/tmp/khy-gateway-sample-home)结果:run-1requestId=780ea813dfdb17dcffa3a8e65964636brun-2requestId=a24363d5651528c20332ec4988000ab1run-3requestId=40510d3964437b3a7a092884d1577707run-4requestId=4c39b115ede5f5168a987d6d4bfd52f6- 4/4 均确认
promptInjected=true - 4/4 仍未落下
agent.language.first_chunk - 4/4 仍以
llm.response.success=false、errorType=timeout收口 run-1/prompt.log再次确认真实请求中存在前置# Language中文约束与[KHY PRIORITY DIRECTIVE]run-1/stdout.log、stderr.log均为0字节;4 个 run 的 trace event 仍只有llm.request、diag.model_request、agent.language.final_response、llm.response- 结论: 新的确定性降偏航措施已由单测覆盖,但在真实链路里仍未拿到可判定首块;当前主阻塞依旧是 Codex 在正文前超时,而不是纠偏链没有生效
- 新 live 证据
/tmp/khy-codex-evidence-20260531c/requestId=01e01a13c20511d589b7d00cb0557465已把“外层 hard timeout 为何遮住 adapter 证据”收敛成结论:prompt.log新增codex_exec生命周期记录后可见:- 第 1 次
spawn在8s时已触发first_response_timeout_fired并done(reject) - 但 adapter 随后又因错误文案里的
sandbox/transport线索立即起了第 2 次spawn - 第 2 次重试把总墙钟时间拖过了 sample harness 的
hardTimeoutMs=16000,从而再次只剩llm.request/diag.model_request
- 第 1 次
- 结论: 之前“证据被 hard timeout 吃掉”的直接原因不是首响 watchdog 没工作,而是
codexAdapter.generate()在首响 timeout 之后仍走了“去 sandbox 再试一次”的内部重试
- 新 live 证据
/tmp/khy-codex-evidence-20260531d/requestId=b8729bb5909f4b2bfdc1e04622f70ba8已验证本轮修正生效:prompt.log只剩 1 次codex_exec stage=spawn- 同一请求在约
8s内直接落下llm.response.success=false、errorType=timeout typeCounts = { llm.request, diag.model_request, agent.language.final_response, llm.response }hardTimeout=false- 结论: “响应前卡死”目前已从“outer hard timeout 掩盖真实原因”收敛为“Codex websocket 在首个 meaningful progress 前持续
Operation not permitted/ reconnect 噪声,最终由首响 timeout 正常收口”
- 新对照试验已把“响应前卡死”继续拆成 3 条独立条件:
- 沙箱内 DNS/网络限制:
nslookup ai.mindflow.com.cn报socket(): Operation not permitted- Node
dns.lookup报EAI_AGAIN - Python
getaddrinfo报Temporary failure in name resolution - 结论: 在当前 AI 沙箱里,Codex CLI 的网络链路会被环境限制直接放大成 reconnect/timeout
HOME=/tmp/...的临时主目录会单独破坏 Codex CLI:- 裸命令
HOME=/tmp/khy-codex-home-probe codex exec ...在沙箱外也会复现 - 典型日志:
Refusing to create helper binaries under temporary dir "/tmp"、tls handshake eof、error sending request for url (https://api.openai.com/v1/responses) - 结论: 之前多次
HOME=/tmp/...sample 失败,不应再被解读成 KHY 主链路本身故障
- 裸命令
- 正常
HOME下,完整 KHY → Codex CLI 路径在紧凑 prompt 模式下可成功,但真实首响约11s~13s:requestId=f8631565c0e7eb5177e5f323c3ca02f7:--timeout-ms 20000成功,durationMs=13366requestId=25a10bf7bd8398c4ac5e8b2ee565ffb1:新的gateway sample默认20000ms也成功,durationMs=11314- 对应输出目录:
/tmp/khy-codex-evidence-20260531j/tmp/khy-codex-evidence-20260531k
- 结论: 正常环境下当前主问题已从“永远卡死”收敛成“旧的 8s / 12s 采样窗口过短,会误杀健康样本”
- 沙箱内 DNS/网络限制:
- 已完成
codexAdapter.buildCliPrompt()的 CLI 紧凑化改造:- 现在优先用
options.messages构造最近对话 + 当前请求,不再把整段 flattened prompt 原样写入 stdin - live 证据显示
stdin_write bytes已从37964降到654 - 这次改造本身没有单独解决
HOME=/tmp或沙箱 DNS 限制,但为正常HOME下成功采样创造了更稳定前提
- 现在优先用
- 已把
gateway sample codex默认首响窗口从12000ms上调到20000ms- 原因: 正常
HOME+ 紧凑 prompt 的健康成功样本真实耗时已测到11.3s与13.3s - 同时在非 JSON 模式下,若检测到
HOME位于/tmp,会显式提示“临时 HOME 可能造成 tls handshake eof / reconnect 假故障” - 现在在
gateway sample --json输出里,也会结构化附带environment.homeRisk,明确给出homeDir、tmpDir、isTempHome、hint与recommendation - 新批量正常
HOME采样/tmp/khy-codex-batch-20260531c(3 次串行 one-shot,HOME=/home/kodehu03)结果:run-1requestId=a5629039e22daf62877bec2939267969,durationMs=9657run-2requestId=050e6611e692e3faa42698e18a765082,durationMs=9954run-3requestId=73ac0c2c60537fdcdb099d9d7d3315f6,durationMs=109113/3均promptInjected=true、firstChunk=zh、llm.response.success=true- 结论: 结合此前
11314ms/13366ms成功样本,当前正常HOME下20000ms仍有足够余量;现阶段暂不需要再拆strict/normal两套默认窗口
- 原因: 正常
- 已把“临时 HOME 风险”下沉到
codexAdapter本身:- 现在即使不是通过
gateway sample入口,只要HOME落在临时目录且 Codex 失败命中 timeout / reconnect / tls 相关模式,最终错误文案也会附带:home_hint=temp_home:<path>codex_cli_temp_home_may_break_tls_or_helper_setup
- 同时会额外发出一条状态提示,明确指出
HOME位于临时目录可能破坏 helper/bin 或 TLS 会话 - 回归已补:
backend/tests/gatewayAdapters.stability.test.js
- 现在即使不是通过
- 已把“临时 HOME 风险”继续上浮到常用诊断面:
gateway status --json现在会输出environment.homeRiskgateway status在活跃通道为codex且HOME位于/tmp时,会直接打印环境提示khy doctor现在新增Codex HOME 环境检查项- 实机验证:
- 当前
HOME=/home/kodehu03 khy gateway status --json已真实返回environment.homeRisk.isTempHome=falsekhy doctor已真实显示Codex HOME 环境 — HOME=/home/kodehu03 不在临时目录
- 当前
- 结论补充: 当自动放宽 strict、adapter 内重试和 direct fallback 都被尽量压掉后,Codex 仍可能在首段正文出现前停住;这进一步证明当前主要阻塞点是
Codex CLI (mindflow)自身响应前卡死,而不是回退链路污染了语言审计
- 真实 REPL 请求
- 已完成诊断分流改造:把“语言偏航”和“无语言事件”拆成更具体的 request 态
backend/src/services/traceAuditService.js现在在getLatestLanguageConsistencySummary()中优先锚定最近 request,而不是盲目回看旧的语言事件- 当请求仍停在模型响应前时,会返回
reason=awaiting_model_output_for_request、blockedBy=pre_response_stall - 当已经收到模型响应但没落下语言审计事件时,会返回
reason=language_audit_missing_after_response、blockedBy=language_audit_gap getRequestTraceSummary()现在也会保留这些“未完成但同 requestId 相关”的语言诊断,而不是直接丢掉- 回归已通过:
backend/tests/services/traceAuditService.requestId.test.jsbackend/tests/initDoctor.codingAgentSmoke.test.js
- 已修正 one-shot / standalone chat 的交付误报:
backend/src/services/traceAuditService.js现在会把“有llm.request+llm.response、但无agent.delivery.final、且不带 tool-loop 迹象”的请求归类为response_onlydoctor侧已把response_only视为信息态,不再当作最近交付链路断裂- 真实审计目录
/tmp/khy-live-audit-codex-20260531c已验证:requestId=80aceeb617b47ee17a9d88eacb96bf14当前latestDeliveryRequest.status=response_only
- 已把“协议优先级风险”从猜测推进为有证据支撑的现象结论:
- KHY 前置协议确实进入了真实 Codex 请求,而不是只存在于本地拼装逻辑
- 历史审计样本仍出现过英文首段偏航,因此风险的本质不再是“KHY 有没有注入协议”,而是“上游/适配器链路仍可能在 KHY 之后施加更强约束,或在生成阶段发生语言偏航”
- 当前剩余未闭合问题只剩量化层面:前置
# Language注入后,英文首段出现频率是否已经下降
- 已澄清更大范围
aiGateway回归阻塞并非源码语法错误:node -c backend/src/services/gateway/adapters/traeAdapter.js通过npm --prefix backend test -- --runInBand --no-cache backend/tests/aiGateway.stability.regressions.test.js全部23项通过- 结论: 先前
extractMessageText重复声明报错更像 Jest/Babel 缓存脏,不是当前traeAdapter.js源码需要修复
3 件最紧急的事#
- [x] 澄清
khy_os-0.1.78/的1480个删除是否应保留- 结论: 这批删除不影响当前构建/运行,但现态不符合仓库既有模式,更像误删或未完成的快照清理
- 处理策略: 不把这批删除混入本轮修复;如需治理,单独做
khy_os-*快照整理
- [x] 找到为何近期仍有 request 只落
agent.delivery.final- 结论: 近期大部分
eventCount=1且status=completed样本是 Jest 测试噪音,不是线上真实闭环退化 - 根因:
toolUseLoop在无 session 情况下仍会写agent.delivery.final,而traceAudit.logEvent()会自动分配sess_* - 已修复: 测试运行默认改写到
/tmp/khy-audit-jest/worker-*,避免继续污染~/.khy/audit
- 结论: 近期大部分
- [x] 为
Codex CLI (mindflow)设计确定性降偏航措施- 已知结论: KHY 注入已发生,但
requestId=039eae08f5640088a115cdff7267cbcf、d5869d9478f26d4ca1c157507d222881、bfd5df1e0206efa8bde5bed87e9647db、ae947e8f6602ca6fd5237cbc85eed11c仍出现英文首段 - 新进展:
requestId=8eb49ea7c0c2f6d98ff5e4bdabfdafbf已证明即便 Codex 首段偏到英文,约束守卫也能阻止违规工具调用并把交付收敛到totalToolCalls=0 - 当前进展: 已新增“请求前显式
# Language中文约束块”并补回归,当前链路从“事后纠偏”升级成“前置约束 + 执行层守卫” - 本轮新增: 为
codex单独预留 1 次语言纠偏重试额度,不再受普通maxAdapterAttempts=1卡死 - 本轮新增: 首段语言守卫现在对非流式调用也生效;即使调用方不消费 chunk,也会在首个可判定英文块出现时中断并重试
- 本轮新增: 若首块只是不确定噪声(如
...),语言审计会继续看最终正文,不再因为模糊首块而放过英文终稿 - 本轮新增:
codexAdapter在首响 timeout 时会附带stage / last_event / recent证据串,可直接区分“完全无输出”和“只出现 thread/turn/reconnect 启动噪声” - 本轮新增:
codexAdapter首响 timeout 证据已升级为 stall 指纹 + milestone 快照(stall / first_thread_started_ms / first_turn_started_ms / first_transport_warning_ms / counts) - 本轮修正: 首响 timeout 即使证据串里包含
Reconnecting...,也不会再被误分类成 reconnect 自愈分支 - 最新 live strict run
requestId=af80c39ec863d86a22b6e00eeff53b8a已把当前主结论固定下来:stall=turn_started_reconnect_loop,即请求已进入turn.started,但在任何 reasoning/tool/assistant 输出前就反复掉进 reconnect - 本轮新增:
doctor现在会跨进程读取持久化的 Codex runtime diagnostics;隔离KHY_DATA_HOME=/tmp/khy-doctor-verify-defaultfix的实机 samplerequestId=f59e2c343b67808555cdda2e61e7248e已验证,新进程khy doctor会直接显示检测到首响阻塞,未触发自愈,并带出stall=turn_started_reconnect_loop - 本轮补强: 默认共享
~/.khy环境下,即使latest已被provider_fallback_recovered覆盖,doctor仍会在同一行追加最近首响阻塞,不再把 stall 证据吞掉 - 本轮扩展: 这套持久化/doctor 消费链已不再写死在
codex;claudeAdapter现已记录bridge_handshake_timeout/bridge_idle_timeout/bridge_no_stream_events/bridge_fallback_recovered - 最新 live run
requestId=80aceeb617b47ee17a9d88eacb96bf14再次证明前置中文协议已实际进请求;该请求后续演化为codex timeout -> API 中转 fallback -> response_only,当前阻塞点更像上游可用性/回退链路收口,而不是注入缺失 - 最新 strict live run
requestId=5c2edb3db439327f7c900e6adac1a467进一步证明:即使尽量禁止放宽 strict 与 direct fallback,Codex 也可能在before_tool_call停住,尚未给出可审计首段正文 - 目标: 把“间歇性偏航”继续压缩成可控行为,而不是只保留告警
- 已知结论: KHY 注入已发生,但
10 件最迫切的事#
- [x] 判定
khy_os-0.1.78/批量删除的归属和处理策略 - [ ] 为
khy_os-*版本快照建立独立治理方案(保留、迁移或对称清理) - [ ] 用 live audit 验证前置
# Language注入后,Codex CLI (mindflow)的可见英文首段是否继续下降 - [x] 为 “0 成功首块 / 多次响应前超时” 的窗口补一套可重复采样方法,避免每次手工拼环境变量
- 已新增
gateway sample codex - 已补测试:
backend/tests/gatewaySample.test.jsbackend/tests/gatewayAdapters.stability.test.js
- 已新增
- [x] 区分“语言偏航”与“上游响应前卡死”两类 Codex 故障,避免把传输阻塞误判成语言回归
- [ ] 判断是否需要为 Jest gateway 回归默认加
--no-cache或清理缓存策略,避免伪语法错误干扰验收 - [x] 统计 recent audit 中
summary_only交付记录的占比和来源 - [x] 用真实 REPL live request 验证
llm.request -> llm.response -> agent.delivery.final已能在同一requestId闭环 - [x] 用真实 REPL live request 验证“不要调用任何工具 / 不要搜索 / 不要读取文件”已被约束守卫尊重,且
agent.delivery.final.totalToolCalls=0 - [x] 追踪
toolUseLoop到aiGateway的 request/session 透传缺口 - [x] 确认哪些入口会跳过
llm.request/llm.response记录 - [x] 采集
KHY_GATEWAY_DEBUG_PROMPT=1日志并归档最小证据 - [x] 复核
Codex CLI (mindflow)下是否存在追加隐藏 system prompt 的稳定迹象 - [x] 评估
gateway status --json在当前环境下的稳定性和耗时 - [x] 定位修复后
eventCount=1且status=completed的 delivery-only 请求来源 - [x] 把
latestLanguageConsistency的“无事件”状态细分成 request 级别的等待/缺口诊断 - [x] 把 one-shot
ai.chat的delivery_event_missing误报降级为response_only - [ ] 梳理当前工作树里与本轮修复相关的改动集合,准备独立提交边界
- 当前最小边界可先收敛到:
backend/src/services/toolUseLoop.jsbackend/src/cli/ai.jsbackend/src/services/traceAuditService.jsbackend/tests/toolUseLoop.webSearchNoToolNudge.test.jsbackend/tests/aiCli.greetingFastpath.test.jsbackend/tests/services/traceAuditService.requestId.test.jsTODO.md
- 说明:
backend/tests/aiCli.requestTraceForwarding.test.js当前仍是未跟踪文件,若保留本轮_directGenerate审计回归,应一并纳入
- 当前最小边界可先收敛到:
- [ ] 决定是否把“delivery summary-only”文案同步暴露到
gateway status --json消费端文档 - [ ] 复查
doctor其他“无样本”分支是否都已降级为信息态
本轮已完成#
- [x] 修复
repl.tasks.interaction里的本地问候回归 - [x] 修复
repl.tasks.interaction里的 quick-task 回归 - [x] 对齐
intentGate测试与当前_intentDirective契约 - [x] 把
backend/src/cli/mermaid.js纳入版本控制 - [x] 把
backend/src/cli/renderTheme.js纳入版本控制 - [x] 把
backend/src/cli/transparency.js纳入版本控制 - [x] 把
backend/src/cli/wordDiff.js纳入版本控制 - [x] 审核
toolUseLoop放宽循环上限和时长后的副作用 - [x] 给
contentBlockUtils.ensureToolResultPairing()补回归测试 - [x] 清理
aiRenderer当前 2 个固定setTimeout告警 - [x] 修复
doctor中“首段语言一致性”误报失败 - [x] 修复
doctor/gateway trace中“最近交付链路”误报告警 - [x] 采集
KHY_GATEWAY_DEBUG_PROMPT=1证据并确认Codex CLI (mindflow)风险为真实且间歇发生 - [x] 为
codex落地最小中文纠偏:拦截可见英文首段、追加恢复指令重试、无重试额度时切到下一通道 - [x] 为
codex落地确定性降偏航第二阶段:增加专用纠偏重试额度、覆盖非流式首段守卫、把模糊首块回退到最终正文判定 - [x] 为
codexAdapter落地首响 timeout 进展证据:记录stall / stage / last_event / milestones / recent,并修正证据串导致的 reconnect 误分类 - [x] 补齐
language_mismatch在抛错路径的回归测试,并把语言一致性 summary 改为优先保留first_chunk证据 - [x] 把语言审计
expectedLanguage改为按请求推断,显式英文请求不再记成zh偏航 - [x] 修复
toolUseLoop调chat/aiGateway时的 trace 透传缺口,避免summary_only审计被拆到不同 request - [x] 修复
ai.chat调aiGateway.generate时的 trace 透传缺口,并确认剩余跳过llm.*的入口主要是khy-fastpath、_directGenerate与本地 deterministic fallback - [x] 通过真实 home-audit live run 确认交互 REPL 的
toolUseLoop链路已闭环;gateway status --json消费端也能正确读取该结果 - [x] 为显式“不要调用工具/搜索/读文件”约束补三层守卫:前置 directive、自动工具注入抑制、违规 tool call 执行拦截,并用
requestId=8eb49ea7c0c2f6d98ff5e4bdabfdafbf验证totalToolCalls=0 - [x] 复核
gateway status --json已能消费最新受约束闭环请求;当前环境本次返回耗时约11s - [x] 扫描最近
1000个 session 量化summary_only:总体15/96=15.63%,最近50个 request 降到2/50=4%,最近20个 session 已为0 - [x] 为
khy-fastpath与_directGenerate补齐llm.request/response审计,并用requestId=11111111111111111111111111111111证明toolUseLoop + khy-fastpath已不再只落最终交付事件 - [x] 找到
eventCount=1且status=completed的主要来源是 Jest 测试写入 home-audit,并把默认测试审计目录切到/tmp/khy-audit-jest/worker-* - [x] 把
latestLanguageConsistency从“泛化 no_language_event”升级成 request 级别诊断,区分awaiting_model_output_for_request与language_audit_missing_after_response - [x] 把 one-shot
ai.chat/ standalone request 从delivery_event_missing误报修正为response_only - [x] 把
codex first response timeout从“任意子进程输出”改成“有意义模型进展”判定,并用真实 strict 样本验证能在启动噪声场景下快速收口 - [x] 新增
gateway sample codex作为可重复 live audit 入口,并验证真实 JSON 输出可直接聚合promptInjected / firstChunk / timeout
最小验证命令#
npm --prefix backend test -- --runInBand backend/tests/initDoctor.codingAgentSmoke.test.js backend/tests/services/traceAuditService.requestId.test.js
node backend/bin/khy.js doctor
node backend/bin/khy.js gateway trace 8fa6d06702483153eb4d178d1413764d
node scripts/check-agent-rules.js --changed
npm run check:version-sync